/* Transpose_64x4x4_x86_AVX.h
 * 
 *  Author          : Alexander J. Yee
 *  Date Created    : 08/30/2015
 *  Last Modified   : 03/10/2024
 * 
 */

#pragma once
#ifndef ymp_Transpose_64x4x4_x86_AVX_H
#define ymp_Transpose_64x4x4_x86_AVX_H
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <immintrin.h>
#include "PublicLibs/CompilerSettings.h"
namespace ymp{
namespace SIMD{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
YM_FORCE_INLINE void transpose_f64x4x4_x86_AVX(__m256d& r0, __m256d& r1, __m256d& r2, __m256d& r3){
    __m256d a0, a1, a2, a3;
    a0 = _mm256_permute2f128_pd(r0, r2, 32);
    a1 = _mm256_permute2f128_pd(r0, r2, 49);
    a2 = _mm256_permute2f128_pd(r1, r3, 32);
    a3 = _mm256_permute2f128_pd(r1, r3, 49);
    r0 = _mm256_unpacklo_pd(a0, a2);
    r1 = _mm256_unpackhi_pd(a0, a2);
    r2 = _mm256_unpacklo_pd(a1, a3);
    r3 = _mm256_unpackhi_pd(a1, a3);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}
#endif
